package com.heima.crm.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.heima.crm.common.result.Result;
import com.heima.crm.common.utils.BaseContext;
import com.heima.crm.common.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override                           //请求参数                 //响应参数          //获取controller 信息的方法封装
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求路径
        String uri = request.getRequestURI();
        log.info("获取到请求路径{}",uri);
        //由请求对象获取头部的token
        String token = request.getHeader("token");
        //判断是否有token
        if (token==null){
            //返回未登录信息               严格遵守前端响应数据接口文档
            Result error = Result.error("NOT_LOGIN");
            //把我们自己的响应类转换为json对象
            String json = JSONObject.toJSONString(error);
            //通过响应对象把转换好的json对象返回给前端
            response.getWriter().write(json);
            //为空结束当前方法
            log.info("token为空");
            return false;
        }
        Claims jwt = null;
        try {
            jwt = JwtUtils.parseJWT(token);
            Long userId = Long.valueOf(jwt.get("id").toString());
            BaseContext.setCurrentId(userId);
        } catch (Exception e) {
            //返回未登录信息
            Result error = Result.error("NOT_LOGIN");
            String json = JSONObject.toJSONString(error);
            response.getWriter().write(json);
            log.info("token伪造或者已过期");
            //结束当前方法
            return false;
        }
        log.info("解析token没问题{}",jwt);
        return true; //true表示放行
    }


}